// 2.2 数字-数学运算
/**
 * 通常，当我们需要用到数字时，我们会使用原始的数据类型，如 int、short、long、float 和 double 等等。这些用于数字的数据类型，其可能的值和数值范围，我们已经在 C++ 数据类型一章中讨论过。
 * 
 * ---------------------
 * 数学运算
 * 在 C++ 中，除了可以创建各种函数，还包含了各种有用的函数供您使用。这些函数写在标准 C 和 C++ 库中，叫做内置函数。您可以在程序中引用这些函数。
 * C++ 内置了丰富的数学函数，可对各种数字进行运算。下表列出了 C++ 中一些有用的内置的数学函数。
 * 为了利用这些函数，您需要引用数学头文件 <cmath>。
 * 
 * double cos(double);
 * 该函数返回弧度角（double 型）的余弦。
 * 
 * double sin(double);
 * 该函数返回弧度角（double 型）的正弦。
 * 
 * double tan(double);
 * 该函数返回弧度角（double 型）的正切。
 * 
 * double log(double);
 * 该函数返回参数的自然对数。
 * 
 * double pow(double, double);
 * 假设第一个参数为 x，第二个参数为 y，则该函数返回 x 的 y 次方。
 * 
 * double hypot(double, double);
 * 该函数返回两个参数的平方总和的平方根，也就是说，参数为一个直角三角形的两个直角边，函数会返回斜边的长度。
 * 
 * double sqrt(double);
 * 该函数返回参数的平方根。
 * 
 * int abs(int);
 * 该函数返回整数的绝对值。
 * 
 * double fabs(double);
 * 该函数返回任意一个浮点数的绝对值。
 * 
 * double floor(double);
 * 该函数返回一个小于或等于传入参数的最大整数。
 * 
*/
#include <iostream>
#define _USE_MATH_DEFINES
#include <cmath>

int main(void)
{
  /**
   * 弧度制，数学术语，指用弧长与半径之比 度量对应圆心角角度的方式。用符号rad表示，读作弧度。等于半径长的圆弧所对的圆心角叫做1弧度的角。由于圆弧长短与圆半径之比，不因为圆的大小而改变，所以弧度数也是一个与圆的半径无关的量。角度以弧度给出时，通常不写弧度单位。另外一种常用的度量角的方法是角度制。弧度制的精髓就在于统一了度量弧与角的单位，从而大大简化了有关公式及运算，尤其在高等数学中，其优点就格外明显。
   * l = |α| * r;
   * 弧长公式
   * 上式中，l为弧长，α为角度（弧度制），r为半径。
   * 推导：由弧度定义得 |α| = l/ r 得 l = |α| * r;
   * 
   * 根据圆周长公式和弧长公式
   * l = |α| * r;
   * |α| = 360° ; 
   * l = 2πr;
   * 
   * 弧度是指用弧长与半径之比 度量对应圆心角角度的方式
   * 
   * ~~~~~~~~~~~
   * 弧长与半径之比对应角度
   * |α| = l / r
   * 
   * 1度 = l/(r*|α|);
   * 1弧度 =  (r*|α|)/l;
   * 当|α|=360，l=2πr
   * 
   * 1度 = π/180;
   * 1弧度 = 180/π;
   * ~~~~~~~~~~~~~~
   * 
   * 
   * 等于半径长的圆弧所对的圆心角叫做1弧度的角
   * 弧度1  弧长r     α 
   * 弧度2π 弧长 2πr  α 360°
   * 
   * 1弧度 = 360/2π = 180/π
   * 
   * 面积公式
   * S = (1/2) * |α| * r^2
   * 上式中，S为面积，α为角度（弧度制），r为半径。
   * 推导：（角度制角度为n°）由S=(n*π*r^2)/360，α=(n*π)/180，将α代入，得到 S = (1/2) * |α| * r^2
   * 
   * 1弧度=(180/π)°角度
   * 1角度=π/180弧度
   * 弧度 radian
   * 角度 degree
   * rad deg
  */
  double r30 = M_PI / 6;
  double r45 = M_PI / 4;
  double r60 = M_PI / 3;
  double r90 = M_PI / 2;

  // tan(r90) 是有值得 ，它无法检测，函数传入的弧度制

  /**
   * 对数
   * 在数学中，对数是对求幂的逆运算，正如除法是乘法的逆运算，反之亦然。这意味着一个数字的对数是必须产生另一个固定数字（基数）的指数。 在简单的情况下，乘数中的对数计数因子。更一般来说，乘幂允许将任何正实数提高到任何实际功率，总是产生正的结果，因此可以对于b不等于1的任何两个正实数b和x计算对数。
   * 如果a的x次方等于N（a>0，且a≠1），那么数x叫做以a为底N的对数（logarithm），记作x=loga N。其中，a叫做对数的底数，N叫做真数。
   * -------------
   * a^x = N;
   * x=loga N;
   * 
   * 自然数 e
   * 首先要知道exp（）函数
   * exp（n）值为e^n次方；
   * 另外log函数包括两种函数 一种以e为底的log（）函数
   * 另一种为以10为底的log 10（）函数；
   * 
   * 另外如果自定义以m为底，求log n的值
   * 需要double a=log(n)/log(m);
   * logm n = logx n / logx m;
   * logm n = loge n / loge m;
  */
  // int a = 10;
  // int x = 3;
  // int N = pow(a, x);

  std::cout << "sin30°\t" << sin(r30) << "\n"
            << "cos60°\t" << cos(r60) << "\n"
            << "tan90°\t" << tan(r90) << "\n"
            << "tan45°\t" << tan(r45) << "\n"
            << "log10 1000\t" << log10(1000) << "\n"
            << "log10 1000\t" << log(1000) / log(10) << "\n"
            << "e ^ 1\t" << exp(1) << "\n"
            << "e ^ 1\t" << pow(M_E, 1) << "\n"
            << "3^2 + 4^2 \t" << hypot(3, 4) << "\n"
            << "9的平方根 \t" << sqrt(9) << "\n"
            << "|-3| \t" << abs(-3) << "\n"
            << "|-2.14| \t" << fabs(-2.14) << "\n"
            << "-2.14向下取整 \t" << floor(-2.14) << "\n"
            << "-2.14向上取整 \t" << ceil(-2.14) << std::endl;

  printf("---------end-----------");
  return 0;
}